home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 398 / 398.xpi / chrome / forecastfox.jar / content / icons / pack-item.js < prev    next >
Text File  |  2010-02-04  |  9KB  |  314 lines

  1. /*------------------------------------------------------------------------------
  2.   Copyright (c) 2008 Ensolis, LLC. All Rights Reserved.
  3.   ----------------------------------------------------------------------------*/
  4.  
  5. /******************************************************************************
  6.  * Get the url to the radar cache.
  7.  *
  8.  * @param   The name of the radar file.
  9.  * @return  The url to the cache file.
  10.  ******************************************************************************/
  11. function getRadarURL(aName)
  12. {     
  13.   //get the disk service
  14.   var mgrSvc = Cc["@ensolis.com/forecastfox/manager-service;1"].
  15.                getService(Ci.ffIManagerService);
  16.   var dskSvc = mgrSvc.disk;
  17.     
  18.   //get file
  19.   var file = dskSvc.get(aName, TYPE_CACHE);
  20.   if (!file.exists())
  21.     return "";
  22.          
  23.   //convert the file to a URL
  24.   return dskSvc.getFileURL(file);
  25. }
  26.   
  27. /******************************************************************************
  28.  * Interface for describing an icon pack.  The component that
  29.  * implements this interface should not be called directly, but instead
  30.  * gotten from the icon service interface.
  31.  * 
  32.  * @status    FROZEN
  33.  * @version   1.0
  34.  ******************************************************************************/
  35. function PackItem() 
  36. {
  37.   this._properties = {};
  38.   this._items = {};
  39. }
  40. PackItem.prototype = {
  41.   __proto__:  new ItemBase("PackItem"),
  42.   _items: null,
  43.   
  44.   ////////////////////////////////
  45.   // ffIPackItem
  46.  
  47.   /**
  48.    * Name of the icon pack.
  49.    */
  50.   get name() { return this.getProperty("name"); },
  51.  
  52.   /**
  53.    * Icon pack has a specific item.
  54.    * 
  55.    * @param   ID of the icon item.
  56.    * @return  True if item exists.
  57.    */
  58.   hasItem: function PackItem_hasItem(aID)
  59.   {    
  60.     return this._items.hasOwnProperty(aID);
  61.   },
  62.                            
  63.   /**
  64.    * Retrieve a an icon item.  Method first tries to find the icon
  65.    * in the list of items.  If it doesn't exist it creates one from the
  66.    * pack properties.
  67.    * 
  68.    * @param   ID of the icon item.
  69.    * @return  An ffIIconItem.
  70.    */
  71.   getItem: function PackItem_getItem(aID)
  72.   {
  73.     //setup variables
  74.     var item = null;
  75.     var unique = aID.split("-");
  76.     var index = unique[0];
  77.     var size = unique[1];
  78.   
  79.     //return radar item
  80.     if (size == "large" && index == "radar")
  81.       item = this._getRadarItem();
  82.       
  83.     //return a stored item
  84.     else if (this.hasItem(aID))
  85.       item = this._items[aID];
  86.     
  87.     //create the item from the pack info
  88.     else {
  89.       item = Cc["@ensolis.com/forecastfox/icon-item;1"].
  90.              createInstance(Ci.ffIIconItem);
  91.       
  92.       //get the icon image info from the pack       
  93.       item.setProperty("width", this.getProperty(size + "Width"));
  94.       item.setProperty("height", this.getProperty(size + "Height"));
  95.       item.setProperty("size", size);
  96.       item.setProperty("index", index);
  97.       item.setProperty("isExemption", false);
  98.     }
  99.     
  100.     //set the url
  101.     if (!item.hasProperty("URL"))
  102.       item.setProperty("URL", this._getURL(item.index, size));
  103.  
  104.       
  105.     //save the item for later use
  106.     this.setItem(item);
  107.             
  108.     //return the item 
  109.     return item;    
  110.   },
  111.   
  112.   /**
  113.    * Retrieve an array of icon items.
  114.    * 
  115.    * @param   Only return the exemptions.
  116.    * @param   Count of items in the array.
  117.    * @return  An array of ffIIconItem components.
  118.    */
  119.   getItems: function PackItem_getItems(aExemption, aCount)
  120.   {
  121.     //loop through items and add to array
  122.     var items = [];
  123.     for (var id in this._items) {
  124.     
  125.       //save item if we want all or we only want exemption and it is
  126.       if (!aExemption || (aExemption && this._items[id].isExemption))
  127.         items.push(this._items[id]);
  128.     }
  129.       
  130.     //sort the array
  131.     items.sort();
  132.     
  133.     //return the array
  134.     aCount.value = items.length;
  135.     return items; 
  136.   },
  137.                   
  138.   /**
  139.    * Sets an icon item.  Used for the exemptions list.
  140.    *
  141.    * @param   The icon item.
  142.    */
  143.   setItem: function PackItem_setItem(aItem)
  144.   {
  145.     this._items[aItem.ID] = aItem.clone();
  146.   },
  147.     
  148.   /**
  149.    * Remove an icon item.
  150.    * 
  151.    * @param   ID of the icon item.
  152.    */
  153.   deleteItem: function PackItem_deleteItem(aID)
  154.   {
  155.     //do nothing if item not set
  156.     if (!this.hasItem(aID))
  157.       return;
  158.     
  159.     //delete the item 
  160.     delete this._items[aID];    
  161.   },
  162.   
  163.   /**
  164.    * Retrieves the URL of the preview image.  Returns an empty string if
  165.    * preview not set.
  166.    */
  167.   getPreviewURL: function PackItem_getPreviewURL()
  168.   {
  169.     //jar file not setup
  170.     if (!this.hasProperty("jar"))
  171.       return "";
  172.       
  173.     //get the disk service
  174.     var mgrSvc = Cc["@ensolis.com/forecastfox/manager-service;1"].
  175.                  getService(Ci.ffIManagerService);
  176.     var dskSvc = mgrSvc.disk;
  177.     
  178.     //get the jar file
  179.     var file = dskSvc.get(this.getProperty("jar"), TYPE_ICONS);
  180.     
  181.     //open file in zip reader
  182.     var reader = Cc["@mozilla.org/libjar/zip-reader;1"].
  183.                  createInstance(Ci.nsIZipReader);
  184.                  
  185.     //toolkit 2.0 and prior or non toolkit
  186.     if ("init" in reader) {
  187.       reader.init(file);
  188.       reader.open();
  189.       
  190.     //toolkit 3.0
  191.     } else
  192.       reader.open(file);
  193.     
  194.     //try to get the preview entry
  195.     var entry = null;
  196.     try {
  197.       entry = reader.getEntry("preview.png");
  198.       
  199.     //close the reader      
  200.     } finally {
  201.       reader.close();
  202.     }
  203.         
  204.     //return empty string if preview didn't exist  
  205.     if (!entry)
  206.       return "";
  207.       
  208.     //return url
  209.     file = dskSvc.get(file.leafName + "!", TYPE_ICONS);
  210.     file.append("preview.png");
  211.     return "jar:" + dskSvc.getFileURL(file);
  212.   },
  213.   
  214.   /**
  215.    * Make a duplicate copy of an icon pack.
  216.    * 
  217.    * @return  A ffIPackItem with the same values as the current item.
  218.    */
  219.   clone: function PackItem_clone()  
  220.   {
  221.     //create a new pack item
  222.     var item = Cc["@ensolis.com/forecastfox/pack-item;1"].
  223.                createInstance(Ci.ffIPackItem);
  224.                
  225.     //loop through all properties and set on new pack
  226.     for (var name in this._properties)
  227.       item.setProperty(name, this._properties[name]);
  228.     
  229.     //loop through items
  230.     for (var id in this._items)
  231.       item.setItem(this._items[id]);
  232.       
  233.     //return the new pack
  234.     return item;             
  235.   },
  236.               
  237.   ////////////////////////////////
  238.   // Internal Functions  
  239.   
  240.   /**
  241.    * Retrieve the url the icon item.  
  242.    *
  243.    * @param   Index of the item.
  244.    * @param   The size text
  245.    * @return  URL for the item.
  246.    */  
  247.   _getURL: function PackItem__getURL(aIndex, aSize)
  248.   {
  249.     //index not found
  250.     if (aIndex == "N/A" || aIndex == "")
  251.       return "";
  252.       
  253.     //jar file not setup
  254.     if (!this.hasProperty("jar"))
  255.       return "";
  256.         
  257.     //get the disk service
  258.     var mgrSvc = Cc["@ensolis.com/forecastfox/manager-service;1"].
  259.                  getService(Ci.ffIManagerService);
  260.     var dskSvc = mgrSvc.disk;
  261.     
  262.     //get the nsIFile of the image
  263.     var file = dskSvc.get(this.getProperty("jar") + "!", TYPE_ICONS);
  264.     file.append(aSize);
  265.     file.append(aIndex + ".png");
  266.     
  267.     //then convert it to a URL
  268.     return "jar:" + dskSvc.getFileURL(file);
  269.   },
  270.   
  271.   /**
  272.    * Get the radar icon item.  Check if we already have the item and the
  273.    * file name is the same.  Otherwise create from scratch and cache the 
  274.    * item for later use.
  275.    *
  276.    * @return  A ffIIconItem representing a  large radar icon.
  277.    */
  278.   _getRadarItem: function PackItem__getRadarItem()
  279.   {
  280.     //get the radar name
  281.     var name = "radar-" + getPref("profile.current") + ".gif";
  282.     
  283.     //we do not have a radar icon stored so create it.
  284.     var item = null;
  285.     if (!this.hasItem("radar-large")) {  
  286.  
  287.       //create a item
  288.       item = Cc["@ensolis.com/forecastfox/icon-item;1"].
  289.              createInstance(Ci.ffIIconItem);
  290.                  
  291.       item.setProperty("URL", getRadarURL(name));      
  292.       item.setProperty("size", "large");
  293.       item.setProperty("index", "radar");
  294.       item.setProperty("isExemption", false);
  295.       item.setProperty("file", name);
  296.       item.setProperty("width", 0);
  297.       item.setProperty("height", 0);
  298.     
  299.     //we do have one stored so see if it is the same
  300.     } else {
  301.       item = this._items["radar-large"];
  302.       
  303.       //the radar is not the same.  Delete the item and call ourself again
  304.       if (item.getProperty("file") != name) {
  305.         this.deleteItem("radar-large");
  306.         item = this._getRadarItem();
  307.         return item;
  308.       }
  309.     }
  310.     
  311.     //return the item
  312.     return item;
  313.   }
  314. };